#include <iostream>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include<stdio.h>
#include<string.h>
void Child_Write(int wfd)
{
    char buffer[1024]={0};
    int cnt=0;
    int n=0;
    
    while(true)
    {
        snprintf(buffer,sizeof(buffer),"I`m child,pid=%d,cnt=%d",getpid(),cnt++);//将数据格式化到buffer中
        write(wfd,buffer,strlen(buffer));//将数据写入管道
        sleep(1);//每隔一秒写一次
    }
}
void FatherRead(int rfd)
{
    char buffer[1024]={0};
    while(true)
    {
        //有数据的话我们就读，没数据的话我们就等
        //只有上面写了数据，下面才能读到数据
        //如果没有数据，read会阻塞
        buffer[0]=0;
        ssize_t n=read(rfd,buffer,sizeof(buffer)-1);//从管道中读取数据
        if(n>0)
        {
            buffer[n]=0;
            std::cout<<"child say:"<<buffer<<std::endl;
        }
    }
}
int main()
{
    //1.创建管道
    int fds[2]={0};  //fds[0]读端，fds[1]写端
    int n=pipe(fds);
    if(n<0)
    {
        std::cout<<"create pipe error"<<std::endl;
        return 1;
    }
    std::cout<<"fd[0]:"<<fds[0]<<std::endl;
    std::cout<<"fd[1]:"<<fds[1]<<std::endl;
    
    //2.创建子进程
    pid_t id=fork();
    if(id==0)
    {
        //child
        //code
        
        close(fds[0]);//子进程去写，关闭读
        Child_Write(fds[1]);//子进程写数据
        close(fds[1]);//子进程关闭写端
        exit(0);
    }
    //3.关闭不需要的读写端，形成通信信道
    //f->r,c->w  父进程去读，子进程去写
    close(fds[1]);//父进程关闭写端
    FatherRead(fds[0]);//父进程读数据
    //这里就是父进程了，那么我们就得等待子进程了
    waitpid(id,nullptr,0);
    close(fds[0]);//父进程关闭读端
    return 0;
}